package com.zy.core.common.security.util;
import com.zy.core.common.security.entity.UserRealm;
import com.zy.project.system.user.entity.SystemUser;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.RealmSecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.BeanUtils;

/**
 * shiro 工具类
 * 
 * @author ruoyi
 */
public class ShiroUtils {

    public static Subject getSubjct(){
        return SecurityUtils.getSubject();
    }

    public static Session getSession(){
        return SecurityUtils.getSubject().getSession();
    }

    public static void logout(){
        getSubjct().logout();
    }

    public static SystemUser getUser() {
        SystemUser user = null;
        Object obj = getSubjct().getPrincipal();
        if (obj != null){
            user = new SystemUser();
            BeanUtils.copyProperties(obj,user);
        }
        return user;
    }

    public static void setUser(SystemUser user) {
        Subject subject = getSubjct();
        PrincipalCollection principalCollection = subject.getPrincipals();
        String realmName = principalCollection.getRealmNames().iterator().next();
        PrincipalCollection newPrincipalCollection = new SimplePrincipalCollection(user, realmName);
        // 重新加载Principal
        subject.runAs(newPrincipalCollection);
    }

    public static void clearCachedAuthorizationInfo() {
        RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
        UserRealm realm = (UserRealm) rsm.getRealms().iterator().next();
        realm.clearCachedAuthorizationInfo();
    }

    public static String getUserId(){
        String id = getUser().getId();
        return id;
    }

    public static String getLoginName(){
        String loginName = getUser().getUsername();
        return loginName;
    }

    public static String getIp(){
        return getSubjct().getSession().getHost();
    }

    public static String getSessionId(){
        return String.valueOf(getSubjct().getSession().getId());
    }
}
